#define _CRT_SECURE_NO_WARNINGS 1
template<class T, class Ref>
struct __list_iterator {
	typedef ListNode<T> Node;
	typedef __list_iterator<T, Ref> self;    // 为了方便我们重命名为self



	Node* _node;

	__list_iterator(Node* x)
		: _node(x)
	{}

	/* 解引用 */
	Ref operator*() {
		return _node->_data;       // 返回结点的数据
	}
	Ptr operator->() {
		return &_node->_data;
	}

	/* ++it */
	self& operator++() {
		_node = _node->_next;  // 让 _node 指向下一个结点
		return *this;  // 返回加加后的值
	}
	/* it++ */
	self operator++(int) {
		self tmp(*this);   // 拷贝构造一个tmp存储原来的值
		_node = _node->_next;
		return tmp;
	}
	/* != */
	bool operator!=(const self& it) {
		return _node != it._node;  // 它们结点的指针不一样吗？T or F
	}

	/* --it */
	self& operator--() {
		_node = _node->_prev;
		return *this;
	}
	/* it-- */
	self operator--(int) {
		self tmp(*this);
		_node = _node->_prev;
		return tmp;
	}
};
